#ifndef AST_OPERATORBINARY
#define AST_OPERATORBINARY
#include <string>
#include "node.h"

namespace AST {

    /**
     * Operador Binário
     *
     * Estrutura para utilização de operadores binários na construção da árvore
     * abstrata de sintaxe, construída a partir da entrada apresentada ao
     * compilador. Para construção de instância, devem ser apresentados o
     * conteúdo do operador utilizado e os operandos de esquerda e direita.
     *
     * @category AST
     * @package  AST
     */
    class OperatorBinary : public Node {

    private:

        /**
         * Conteúdo Capturado pelo Token
         */
        std::string* _content;

        /**
         * Operando Esquerdo
         */
        Node* _left;

        /**
         * Operando Direito
         */
        Node* _right;

        /**
         * Configuração do Conteúdo do Operador
         *
         * Durante a captura do conteúdo apresentado ao compilador, o operador
         * binário é representado por um símbolo que deve ser apresentado em
         * tempo de construção e configurado por este método.
         *
         * @param  std::string*    Conteúdo para Configuração
         * @return OperatorBinary* Próprio Objeto para Encadeamento
         */
        OperatorBinary* _setContent(std::string*);

        /**
         * Configuração de Operando Esquerdo
         *
         * Operadores binários possuem dois operandos relacionados. Este método
         * configura o elemento utilizado à esquerda durante sua apresentação e
         * é configurado em tempo de construção.
         *
         * @param  Node*           Operando Esquerdo Utilizado
         * @return OperatorBinary* Próprio Objeto para Encadeamento
         */
        OperatorBinary* _setLeft(Node*);

        /**
         * Configuração de Operando Direito
         *
         * Operadores binários possuem dois operandos relacionados. Este método
         * configura o elemento utilizado à direita durante sua apresentação e é
         * configurado em tempo de construção
         *
         * @param  Node*           Operando Direito Utilizado
         * @return OperatorBinary* Próprio Objeto para Encadeamento
         */
        OperatorBinary* _setRight(Node*);

    public:

        /**
         * Construtor Padrão
         *
         * Método responsável pela construção de objetos para operadores
         * binários, que recebe como parâmetro o conteúdo capturado pelo Token
         * durante a leitura da entrada e que representa o operador, e seus
         * operandos esquerdo e direito apresentados.
         *
         * @param std::string* Conteúdo Capturado pelo Token
         * @param Node*        Operando Esquerdo
         * @param Node*        Operando Direito
         */
        OperatorBinary(std::string*, Node*, Node*);

        /**
         * Apresentação de Conteúdo
         *
         * Informa o conteúdo capturado pelo Token que é configurado em tempo de
         * construção do objeto, representante do operador utilizado.
         *
         * @return Conteúdo Solicitado
         */
        std::string* getContent();

        /**
         * Apresentação de Operando Esquerdo
         *
         * Informa o nó de árvore representante do operando esquerdo que foi
         * capturado durante o processamento do conteúdo de entrada e
         * relacionado com o operador binário.
         *
         * @return Node* Elemento Esquerdo Solicitado
         */
        Node* getLeft();

        /**
         * Apresentação de Operando Direito
         *
         * Informa o nó de árvore representante do operando esquerdo que foi
         * capturado durante o processamento do conteúdo de entrada e
         * relacionado com o operador binário.
         *
         * @return Node* Elemento Direito Solicitado
         */
        Node* getRight();

        // Sobrescrita
        std::string toString(int);

        // Sobrescrita
        Node* check();

    };

};

#endif

